home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / _archvrs / unix / unzip51 / unknown.h < prev    next >
C/C++ Source or Header  |  1994-05-30  |  51KB  |  1,448 lines

  1. /*---------------------------------------------------------------------------
  2.  
  3.   unzip.h
  4.  
  5.   This header file is used by all of the UnZip source files.  Its contents
  6.   are divided into seven more-or-less separate sections:  predefined macros,
  7.   OS-dependent includes, (mostly) OS-independent defines, typedefs, function 
  8.   prototypes (or "forward declarations," in the case of non-ANSI compilers),
  9.   macros, and global-variable declarations.
  10.  
  11.   ---------------------------------------------------------------------------*/
  12.  
  13.  
  14.  
  15. #ifndef __unzip_h   /* prevent multiple inclusions */
  16. #define __unzip_h
  17.  
  18. /*****************************************/
  19. /*  Predefined, Machine-specific Macros  */
  20. /*****************************************/
  21.  
  22. #if defined(__GO32__) && defined(unix)   /* DOS extender */
  23. #  undef unix
  24. #endif
  25.  
  26. #if defined(unix) || defined(__convexc__) || defined(M_XENIX)
  27. #  ifndef UNIX
  28. #    define UNIX
  29. #  endif /* !UNIX */
  30. #endif /* unix || __convexc__ || M_XENIX */
  31.  
  32. #ifdef __COMPILER_KCC__
  33. #  include <c-env.h>
  34. #  ifdef SYS_T20
  35. #    define TOPS20
  36. #  endif
  37. #endif /* __COMPILER_KCC__ */
  38.  
  39. /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
  40. #ifdef __POWERC
  41. #  define __TURBOC__
  42. #  define MSDOS
  43. #endif /* __POWERC */
  44. #if defined(__MSDOS__) && (!defined(MSDOS))   /* just to make sure */
  45. #  define MSDOS
  46. #endif
  47.  
  48. #if defined(linux) && (!defined(LINUX))
  49. #  define LINUX
  50. #endif
  51.  
  52. /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C, or
  53.  * Silicon Graphics, or Convex?, or IBM C Set/2, or GNU gcc/emx, or Watcom C,
  54.  * or Macintosh, or Windows NT, or Sequent, or Atari.
  55.  */
  56. #if __STDC__ || defined(MSDOS) || defined(sgi)  /* || defined(__convexc__) */
  57. #  ifndef PROTO
  58. #    define PROTO
  59. #  endif
  60. #  define MODERN
  61. #endif
  62. #if defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__)
  63. #  ifndef PROTO
  64. #    define PROTO
  65. #  endif
  66. #  define MODERN
  67. #endif
  68. #if defined(THINK_C) || defined(MPW) || defined(WIN32) || defined(_SEQUENT_)
  69. #  ifndef PROTO
  70. #    define PROTO
  71. #  endif
  72. #  define MODERN
  73. #endif
  74. #if defined(ATARI_ST)
  75. #  ifndef PROTO
  76. #    define PROTO
  77. #  endif
  78. #  define MODERN
  79. #endif
  80.  
  81. /* turn off prototypes if requested */
  82. #if defined(NOPROTO) && defined(PROTO)
  83. #  undef PROTO
  84. B
  85. #endif
  86.  
  87. /* used to remove arguments in function prototypes for non-ANSI C */
  88. #ifdef PROTO
  89. #  define OF(a) a
  90. #else /* !PROTO */
  91. #  define OF(a) ()
  92. #endif /* ?PROTO */
  93.  
  94. /* bad or (occasionally?) missing stddef.h: */
  95. #if defined(M_XENIX) || defined(DNIX) || (defined(__GNUC__) && defined(sun))
  96. #  define NO_STDDEF_H
  97. #endif
  98.  
  99. /* cannot depend on MODERN for presence of stdlib.h */
  100. #if defined(__GNUC__) || defined(apollo)   /* both define __STDC__ */
  101. #  if (!defined(__EMX__) && !defined(__386BSD__) && !defined(LINUX))
  102. #    define NO_STDLIB_H
  103. #  endif
  104. #endif /* __GNUC__ || apollo */
  105.  
  106. #if defined(__SYSTEM_FIVE) || defined(M_SYSV) || defined(M_SYS5)
  107. #  ifndef SYSV
  108. #    define SYSV
  109. #  endif /* !SYSV */
  110. #endif /* __SYSTEM_FIVE || M_SYSV || M_SYS5 */
  111.  
  112. #if defined(SYSV) || defined(CRAY) || defined(LINUX)
  113. #  ifndef TERMIO
  114. #    define TERMIO
  115. #  endif /* !TERMIO */
  116. #endif /* SYSV || CRAY || LINUX */
  117.  
  118. #if defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr)
  119. #  if (!defined(BSD)) && (!defined(SYSV))
  120. #    define BSD
  121. #  endif /* !BSD && !SYSV */
  122. #endif /* ultrix || bsd4_2 || sun || pyr */
  123. #if defined(__convexc__) || defined(TOPS20) || defined(__386BSD__)
  124. #  if (!defined(BSD)) && (!defined(SYSV))
  125. #    define BSD
  126. #  endif /* !BSD && !SYSV */
  127. #endif /* __convexc__ || TOPS20 || __386BSD__ */
  128.  
  129. #ifdef pyr  /* Pyramid */
  130. #  ifndef ZMEM
  131. #    define ZMEM
  132. #  endif /* !ZMEM */
  133. #endif /* pyr */
  134.  
  135. #ifdef CRAY
  136. #  ifdef ZMEM
  137. #    undef ZMEM
  138. #  endif /* ZMEM */
  139. #endif /* CRAY */
  140.  
  141. /* AMIGADOS2 implies AMIGA (but usually predefined by compiler) */
  142. #if defined(AMIGADOS2) && (!defined(AMIGA))
  143. #  define AMIGA
  144. #endif
  145.  
  146. /* the i386 test below is to catch SCO Unix (which has redefinition
  147.  * warnings if param.h is included), but it probably doesn't hurt if
  148.  * other 386 Unixes get nailed, too...except now that 386BSD and BSDI
  149.  * exist.  Sigh.  <sys/param.h> is mostly included for "BSD", I think.
  150.  * [An alternate fix for SCO Unix is below.]
  151.  */
  152. #if defined(MINIX) || defined(__386BSD__) || (defined(i386) && defined(unix))
  153. #  define NO_PARAM_H
  154. #define RAND_HEAD_LEN 12
  155. #endif /* MINIX || (i386 && unix && !BSD) */
  156.  
  157.  
  158.  
  159.  
  160.  
  161. /***************************/
  162. /*  OS-Dependent Includes  */    /* GRR:  this needs overhaul!! */
  163. /***************************/
  164.  
  165. #ifndef MINIX            /* Minix needs it after all the other includes (?) */
  166. #  include <stdio.h>
  167. #endif
  168. #include <ctype.h>       /* skip for VMS, to use tolower() function? */
  169. #include <errno.h>       /* used in mapname() */
  170. #ifdef VMS
  171. #  include <types.h>     /* (placed up here instead of in VMS section below */
  172. #  include <stat.h>      /* because types.h is used in some other headers) */
  173. #else /* !VMS */
  174. #  ifdef AMIGA
  175. #    ifdef AZTEC_C
  176. #      include <clib/dos_protos.h>
  177. #      include <pragmas/dos_lib.h>
  178. #      include "amiga/z-stat.h"
  179. #      define MODERN
  180. #      define O_BINARY 0
  181. #    else /* !AZTEC_C */
  182. #      include <sys/types.h>         /* must come before stat.h */
  183. #      include <sys/stat.h>
  184. #      include <proto/dos.h>
  185. #      define O_BINARY   O_RAW
  186. #    endif /* ?AZTEC_C */
  187. #    include <time.h>
  188. #    define dup
  189. #  else /* !AMIGA */
  190. #    if (!defined(THINK_C)) && (!defined(MPW)) && (!defined(ATARI_ST))
  191. #      include <sys/types.h>         /* off_t, time_t, dev_t, ... */
  192. #      include <sys/stat.h>
  193. #    endif /* !THINK_C && !MPW */
  194. #  endif /* ?AMIGA */
  195. #endif /* ?VMS */
  196.  
  197. #ifdef MODERN
  198. #  ifndef NO_STDDEF_H
  199. #    include <stddef.h>
  200. #  endif
  201. #  ifndef NO_STDLIB_H
  202. #    include <stdlib.h>    /* standard library prototypes, malloc(), etc. */
  203. #  endif
  204. #  if defined(__386BSD__) || defined(LINUX)
  205. #    include <unistd.h>
  206. #  endif
  207. #  include <string.h>      /* defines strcpy, strcmp, memcpy, etc. */
  208.    typedef size_t extent;
  209.    typedef void voidp;
  210. #else /* !MODERN */
  211.    char *malloc();
  212.    char *strchr(), *strrchr();
  213.    long lseek();
  214.    typedef unsigned int extent;
  215. #  define void int
  216.    typedef char voidp;
  217. #endif /* ?MODERN */
  218.  
  219. /* this include must be down here for SysV.4, for some reason... */
  220. #include <signal.h>      /* used in unzip.c, file_io.c */
  221.  
  222. /*---------------------------------------------------------------------------
  223.     Next, a word from our Unix (mostly) sponsors:
  224.   ---------------------------------------------------------------------------*/
  225.  
  226. #if defined(UNIX) || defined(TOPS20)
  227. #  ifndef NO_PARAM_H
  228. #    if 0  /* [GRR: this is an alternate fix for SCO's redefinition bug] */
  229. #    ifdef NGROUPS_MAX
  230. #      undef NGROUPS_MAX       /* SCO bug:  defined again in <param.h> */
  231. #    endif /* NGROUPS_MAX */
  232. #    endif /* 0 */
  233. #    include <sys/param.h>     /* conflict with <sys/types.h>, some systems? */
  234. #  endif /* !NO_PARAM_H */
  235.  
  236. #  ifdef BSD
  237. #    include <sys/time.h>
  238. #    include <sys/timeb.h>
  239. #  else /* !BSD */
  240. #    ifndef MINIX
  241. #      define NO_MKDIR   /* for mapname() */
  242. #    endif
  243.      struct tm *gmtime(), *localtime();
  244. #  endif /* ?BSD */
  245.  
  246. #  if defined(_AIX) || defined(LINUX) || (!defined(BSD))
  247. #    include <time.h>
  248. #  endif
  249.  
  250. #  if defined(__386BSD__) || defined(_POSIX_SOURCE)
  251. #    include <utime.h>
  252. #  else
  253.      struct utimbuf {
  254.          time_t actime;     /* new access time */
  255.          time_t modtime;    /* new modification time */
  256.      };
  257. #  endif /* ?(__386BSD__ || _POSIX_SOURCE) */
  258. #endif /* UNIX || TOPS20 */
  259.  
  260. #if defined(V7) || defined(BSD)
  261. #  define strchr    index
  262. #  define strrchr   rindex
  263. #endif
  264.  
  265. #if 0   /* GRR:  is this even used? */
  266. #ifndef BSIZE
  267. #  ifdef MINIX
  268. #    define BSIZE         1024       /* disk block size */
  269. #  else /* !MINIX */
  270. #    ifdef DEV_BSIZE
  271. #      define BSIZE       DEV_BSIZE
  272. #    else
  273. #      define BSIZE       512
  274. #    endif
  275. #  endif /* ?MINIX */
  276. #endif /* !BSIZE */
  277. #endif /* 0 */
  278.  
  279. /*---------------------------------------------------------------------------
  280.     And now, our MS-DOS and OS/2 corner:
  281.   ---------------------------------------------------------------------------*/
  282.  
  283. #ifdef MSDOS
  284. #  include <dos.h>            /* for REGS macro (TC) or _dos_setftime (MSC) */
  285. #  ifdef __TURBOC__           /* includes Power C                           */
  286. #    include <sys/timeb.h>    /* for structure ftime                        */
  287. #    ifndef __BORLANDC__      /* there appears to be a bug (?) in Borland's */
  288. #      include <mem.h>        /*   MEM.H related to __STDC__ and far poin-  */
  289. #    endif                    /*   ters. (dpk)  [mem.h included for memcpy] */
  290. #  else /* !__TURBOC__ */
  291. #    ifndef MSC               /* assume Microsoft's compiler and fake ID if */
  292. #      define MSC             /*   necessary (it is in 5.0; apparently not  */
  293. #    endif                    /*   in 5.1 and 6.0)                          */
  294. #  endif /* ?__TURBOC__ */
  295. #endif /* MSDOS */
  296.  
  297. #if defined(_MSC_VER) && (!defined(MSC))
  298. #  define MSC
  299. #endif
  300.  
  301. #if defined(__IBMC__) && defined(__OS2__)
  302. #  define S_IFMT 0xF000
  303. #  define timezone _timezone
  304. #endif
  305.  
  306. #ifdef __WATCOMC__
  307. #  define __32BIT__
  308. #  undef far
  309. #  define far
  310. #endif
  311.  
  312. #ifdef __EMX__
  313. #  ifndef __32BIT__
  314. #    define __32BIT__
  315. #  endif
  316. #  define far
  317. #endif /* __EMX__ */
  318.  
  319. #ifdef MSC                    /* should be defined for all versions of MSC */
  320. #  ifndef _MSC_VER            /* new with 5.1 or 6.0 ... */
  321. #    define DECLARE_ERRNO     /* not declared in errno.h in 5.0 or earlier? */
  322. #  endif
  323. #endif
  324.  
  325. #if defined(MSDOS) || defined(OS2)
  326. #  include <io.h>             /* lseek(), open(), setftime(), dup(), creat() */
  327. #  include <time.h>           /* localtime() */
  328. #  ifdef __GO32__
  329.      int setmode(int, int);   /* not in djgcc's include files */
  330. #  endif
  331. #endif
  332.  
  333. #ifdef OS2                    /* defined for all OS/2 compilers */
  334. #  ifdef MSDOS
  335. #    undef MSDOS
  336. #  endif
  337. #  ifdef isupper
  338. #    undef isupper
  339. #  endif
  340. #  ifdef tolower
  341. #    undef tolower
  342. #  endif
  343. #  define isupper(x)   IsUpperNLS((unsigned char)(x))
  344. #  define tolower(x)   ToLowerNLS((unsigned char)(x))
  345. #endif
  346.  
  347. #ifdef WIN32
  348. #  define getch() getchar()
  349. #  include <io.h>             /* read(), open(), etc. */
  350. #  include <time.h>
  351. #  include <memory.h>
  352. #  include <direct.h>         /* mkdir() */
  353. #  ifdef FILE_IO_C
  354. #    include <fcntl.h>
  355. #    include <conio.h>
  356. #    include <sys\types.h>
  357. #    include <sys\utime.h>
  358. #    include <windows.h>
  359. #  endif
  360. #endif
  361.  
  362. /*---------------------------------------------------------------------------
  363.     Followed by some VMS (and other) stuff:
  364.   ---------------------------------------------------------------------------*/
  365.  
  366. #ifdef VMS
  367. #  include <time.h>               /* the usual non-BSD time functions */
  368. #  include <file.h>               /* same things as fcntl.h has */
  369. #  include <rms.h>
  370. #  define _MAX_PATH NAM$C_MAXRSS  /* to define FILNAMSIZ below */
  371. #  define RETURN    return_VMS    /* VMS interprets return codes incorrectly */
  372. #  define DIR_BEG  '['
  373. #  define DIR_END  ']'
  374. #  define DIR_EXT  ".dir"
  375. #else /* !VMS */
  376. #  ifndef THINK_C
  377. #    define RETURN  return        /* only used in main() */
  378. #  else
  379. #    define RETURN(v) { int n; n=(v); fprintf(stderr,\
  380.        "\npress <return> to continue "); while (getc(stdin)!='\n');\
  381.        putc('\n', stderr); InitCursor(); goto start;}
  382. #  endif
  383. #  ifdef V7
  384. #    define O_RDONLY  0
  385. #    define O_WRONLY  1
  386. #    define O_RDWR    2
  387. #  else /* !V7 */
  388. #    ifdef MTS
  389. #      include <sys/file.h>     /* MTS uses this instead of fcntl.h */
  390. #      include <timeb.h>
  391. #      include <time.h>
  392. #    else /* !MTS */
  393. #      ifdef COHERENT           /* Coherent 3.10/Mark Williams C */
  394. #        include <sys/fcntl.h>
  395. #        define SHORT_NAMES
  396. #        define tzset  settz
  397. #      else /* !COHERENT */
  398. #        ifndef ATARI_ST
  399. #          include <fcntl.h>    /* O_BINARY for open() w/o CR/LF translation */
  400. #        endif
  401. #        ifdef TOPS20
  402.            extern int open(), close(), read(), write();
  403.            extern int stat(), unlink(), jsys(), fcntl();
  404.            extern long lseek(), dup(), creat();
  405. #          include <sys/file.h>
  406. #          include <timex.h>
  407. #          include <monsym.h>   /* get amazing monsym() macro */
  408. #          define REALLY_SHORT_NAMES
  409. #          define NO_MKDIR
  410. #          define DIR_BEG  '<'
  411. #          define DIR_END  '>'
  412. #          define DIR_EXT  ".directory"
  413. #        endif /* TOPS20 */
  414. #      endif /* ?COHERENT */
  415. #    endif /* ?MTS */
  416. #  endif /* ?V7 */
  417. #endif /* ?VMS */
  418.  
  419. /*---------------------------------------------------------------------------
  420.     And some Mac stuff for good measure:
  421.   ---------------------------------------------------------------------------*/
  422.  
  423. #ifdef THINK_C
  424. #  define MACOS
  425. #  ifndef __STDC__            /* if Think C hasn't defined __STDC__ ... */
  426. #    define __STDC__ 1        /*   make sure it's defined: it needs it */
  427. #  else /* __STDC__ defined */
  428. #    if !__STDC__             /* sometimes __STDC__ is defined as 0; */
  429. #      undef __STDC__         /*   it needs to be 1 or required header */
  430. #      define __STDC__ 1      /*   files are not properly included. */
  431. #    endif /* !__STDC__ */
  432. #  endif /* ?defined(__STDC__) */
  433. #endif /* THINK_C */
  434.  
  435. #ifdef MPW
  436. #  define MACOS
  437. #  include <Errors.h>
  438. #  include <Files.h>
  439. #  include <Memory.h>
  440. #  include <Quickdraw.h>
  441. #  include <ToolUtils.h>
  442. #  define CtoPstr c2pstr
  443. #  define PtoCstr p2cstr
  444. #  ifdef CR
  445. #    undef  CR
  446. #  endif
  447. #endif /* MPW */
  448.  
  449. #ifdef MACOS
  450. #  define open(x,y) macopen(x,y, gnVRefNum, glDirID)
  451. #  define close macclose
  452. #  define read macread
  453. #  define write macwrite
  454. #  define lseek maclseek
  455. #  define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType)
  456. #  define stat(x,y) macstat(x,y,gnVRefNum, glDirID)
  457. #  define dup
  458.  
  459. #  ifdef THINK_C
  460. #    define CREATOR     'KAHL'
  461. #  else
  462. #    ifdef MCH_MACINTOSH
  463. #      define CREATOR   'Manx'
  464. #    else
  465. #      define CREATOR   'MPS '
  466. #    endif /* ?MCH_MACINTOSH */
  467. #  endif /* ?THINK_C */
  468.  
  469. #  ifndef isascii
  470. #    define isascii(c) ((unsigned char)(c) <= 0x3F)
  471. #  endif
  472.  
  473. #  include "macstat.h"
  474.  
  475. typedef struct _ZipExtraHdr {
  476.     unsigned short header;    /*    2 bytes */
  477.     unsigned short data;      /*    2 bytes */
  478. } ZIP_EXTRA_HEADER;
  479.  
  480. typedef struct _MacInfoMin {
  481.     unsigned short header;    /*    2 bytes */
  482.     unsigned short data;      /*    2 bytes */
  483.     unsigned long signature;  /*    4 bytes */
  484.     FInfo finfo;              /*   16 bytes */
  485.     unsigned long lCrDat;     /*    4 bytes */
  486.     unsigned long lMdDat;     /*    4 bytes */
  487.     unsigned long flags ;     /*    4 bytes */
  488.     unsigned long lDirID;     /*    4 bytes */
  489.                               /*------------*/
  490. } MACINFOMIN;                 /* = 40 bytes for size of data */
  491.  
  492. typedef struct _MacInfo {
  493.     unsigned short header;    /*    2 bytes */
  494.     unsigned short data;      /*    2 bytes */
  495.     unsigned long signature;  /*    4 bytes */
  496.     FInfo finfo;              /*   16 bytes */
  497.     unsigned long lCrDat;     /*    4 bytes */
  498.     unsigned long lMdDat;     /*    4 bytes */
  499.     unsigned long flags ;     /*    4 bytes */
  500.     unsigned long lDirID;     /*    4 bytes */
  501.     char rguchVolName[28];    /*   28 bytes */
  502.                               /*------------*/
  503. } MACINFO;                    /* = 68 bytes for size of data */
  504. #endif /* MACOS */
  505.  
  506. /*---------------------------------------------------------------------------
  507.     Atari ST section:
  508.   ---------------------------------------------------------------------------*/
  509.  
  510. #ifdef ATARI_ST
  511. #  ifdef __TURBOC__
  512. #    include <ext.h>   /* stat() */
  513. #    include <tos.h>   /* OS-specific functions (Fdup) */
  514. #  endif
  515. #  include <time.h>
  516. #  ifndef S_IFMT
  517. #    define S_IFMT     (S_IFCHR | S_IFREG | S_IFDIR)
  518. #  endif
  519. #  ifndef O_BINARY
  520. #    define O_BINARY   0
  521. #  endif
  522. #  define dup     Fdup
  523. #  define mkdir   Dcreate
  524. #endif
  525.  
  526. /*---------------------------------------------------------------------------
  527.     And finally, some random extra stuff:
  528.   ---------------------------------------------------------------------------*/
  529.  
  530. #ifdef MINIX
  531. #  include <stdio.h>
  532. #endif
  533.  
  534. #ifdef SHORT_NAMES                  /* Mark Williams C, ...? */
  535. #  define extract_or_test_files     xtr_or_tst_files
  536. #  define extract_or_test_member    xtr_or_tst_member
  537. #endif
  538.  
  539. #ifdef REALLY_SHORT_NAMES           /* TOPS-20 linker:  first 6 chars */
  540. #  define process_end_central_dir   XXpecd
  541. #  define process_cdir_file_hdr     XXpcdfh
  542. #  define process_local_file_hdr    XXplfh
  543. #  define process_central_dir       XXpcd
  544. #  define extract_or_test_files     XXxotf  /* necessary? */
  545. #  define extract_or_test_member    XXxotm  /* necessary? */
  546. #  define IsUpperNLS                XXiu
  547. #  define ToLowerNLS                XXtl
  548. #  define UpdateCRC                 XXuc
  549. #  define check_for_newer           XXcfn
  550. #  define overwrite_all             XXoa
  551. #  define process_all_files         XXpaf
  552. #  define extra_field               XXef
  553. #  define explode_lit8              XXel8
  554. #  define explode_lit4              XXel4
  555. #  define explode_nolit8            XXnl8
  556. #  define explode_nolit4            XXnl4
  557. #  define cpdist8                   XXcpdist8
  558. #  define inflate_codes             XXic
  559. #  define inflate_stored            XXis
  560. #  define inflate_fixed             XXif
  561. #  define inflate_dynamic           XXid
  562. #  define inflate_block             XXib
  563. #  define maxcodemax                XXmax
  564. #endif
  565.  
  566. #ifdef MTS
  567. #  include <unix.h>                 /* some important non-ANSI routines */
  568. #  define mkdir(s,n) (-1)           /* no "make directory" capability */
  569. #  define EBCDIC                    /* set EBCDIC conversion on */
  570. #endif
  571.  
  572.  
  573.  
  574.  
  575.  
  576. /*************/
  577. /*  Defines  */
  578. /*************/
  579.  
  580. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  581. #  define DOS_NT_OS2
  582. #endif
  583.  
  584. #if defined(MSDOS) || defined(OS2)
  585. #  define DOS_OS2
  586. #endif
  587.  
  588. #if defined(MSDOS) || defined(OS2) || defined(ATARI_ST)
  589. #  define DOS_OS2_TOS
  590. #endif
  591.  
  592. #if defined(MSDOS) || defined(ATARI_ST)
  593. #  define DOS_TOS
  594. #endif
  595.  
  596. #if defined(MSDOS) || defined(TOPS20) || defined(VMS)
  597. #  define DOS_T20_VMS
  598. #endif
  599.  
  600. #if defined(TOPS20) || defined(VMS)
  601. #  define T20_VMS
  602. #endif
  603.  
  604. #ifndef WSIZE
  605. #  define WSIZE 0x8000       /* window size--must be a power of two, and */
  606. #endif /* !WSIZE */          /*  at least 32K for zip's deflate method */
  607.  
  608. #define DIR_BLKSIZ    64     /* number of directory entries per block
  609.                               *  (should fit in 4096 bytes, usually) */
  610. #ifndef INBUFSIZ
  611. #  define INBUFSIZ    2048   /* works for MS-DOS small model */
  612. #endif /* !INBUFSIZ */
  613.  
  614. /*
  615.  * If <limits.h> exists on most systems, should include that, since it may
  616.  * define some or all of the following:  NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
  617.  * _POSIX_PATH_MAX.
  618.  */
  619. #ifdef DOS_OS2_TOS
  620. #  include <limits.h>
  621. #endif
  622.  
  623. #ifdef _MAX_PATH
  624. #  define FILNAMSIZ       (_MAX_PATH)
  625. #else /* !_MAX_PATH */
  626. #  define FILNAMSIZ       1025
  627. #endif /* ?_MAX_PATH */
  628.  
  629. #ifndef PATH_MAX
  630. #  ifdef MAXPATHLEN                /* defined in <sys/param.h> some systems */
  631. #    define PATH_MAX      MAXPATHLEN
  632. #  else
  633. #    if FILENAME_MAX > 255         /* used like PATH_MAX on some systems */
  634. #      define PATH_MAX    FILENAME_MAX
  635. #    else
  636. #      define PATH_MAX    (FILNAMSIZ - 1)
  637. #    endif
  638. #  endif /* ?MAXPATHLEN */
  639. #endif /* !PATH_MAX */
  640.  
  641. #define OUTBUFSIZ         INBUFSIZ
  642.  
  643. #define ZSUFX             ".zip"
  644. #define CENTRAL_HDR_SIG   "\113\001\002"   /* the infamous "PK" signature */
  645. #define LOCAL_HDR_SIG     "\113\003\004"   /*  bytes, sans "P" (so unzip */
  646. #define END_CENTRAL_SIG   "\113\005\006"   /*  executable not mistaken for */
  647. #define EXTD_LOCAL_SIG    "\113\007\010"   /*  zipfile itself) */
  648.  
  649. #define SKIP              0    /* choice of activities for do_string() */
  650. #define DISPLAY           1
  651. #define FILENAME          2
  652. #define EXTRA_FIELD       3
  653.  
  654. #define DOES_NOT_EXIST    -1   /* return values for check_for_newer() */
  655. #define EXISTS_AND_OLDER  0
  656. #define EXISTS_AND_NEWER  1
  657.  
  658. /* version_made_by codes (central dir):  make sure these */
  659. /*  are not defined on their respective systems!! */
  660. #define FS_FAT_           0    /* filesystem used by MS-DOS, OS/2, NT */
  661. #define AMIGA_            1
  662. #define VMS_              2
  663. #define UNIX_             3
  664. #define VM_CMS_           4
  665. #define ATARI_            5
  666. #define FS_HPFS_          6    /* filesystem used by OS/2, NT */
  667. #define MAC_              7
  668. #define Z_SYSTEM_         8
  669. #define CPM_              9
  670. #define TOPS20_           10
  671. #define FS_NTFS_          11   /* filesystem used by Windows NT */
  672. /* #define QDOS_          12?  */
  673. #define NUM_HOSTS         12   /* index of last system + 1 */
  674.  
  675. #define STORED            0    /* compression methods */
  676. #define SHRUNK            1
  677. #define REDUCED1          2
  678. #define REDUCED2          3
  679. #define REDUCED3          4
  680. #define REDUCED4          5
  681. #define IMPLODED          6
  682. #define TOKENIZED         7
  683. #define DEFLATED          8
  684. #define NUM_METHODS       9    /* index of last method + 1 */
  685. /* don't forget to update list_files() appropriately if NUM_METHODS changes */
  686.  
  687. #define PK_COOL           0    /* no error */
  688. #define PK_WARN           1    /* warning error */
  689. #define PK_ERR            2    /* error in zipfile */
  690. #define PK_BADERR         3    /* severe error in zipfile */
  691. #define PK_MEM            4    /* insufficient memory */
  692. #define PK_MEM2           5    /* insufficient memory */
  693. #define PK_MEM3           6    /* insufficient memory */
  694. #define PK_MEM4           7    /* insufficient memory */
  695. #define PK_MEM5           8    /* insufficient memory */
  696. #define PK_NOZIP          9    /* zipfile not found */
  697. #define PK_PARAM          10   /* bad or illegal parameters specified */
  698. #define PK_FIND           11   /* no files found */
  699. #define PK_DISK           50   /* disk full */
  700. #define PK_EOF            51   /* unexpected EOF */
  701.  
  702. #define DF_MDY            0    /* date format 10/26/91 (USA only) */
  703. #define DF_DMY            1    /* date format 26/10/91 (most of the world) */
  704. #define DF_YMD            2    /* date format 91/10/26 (a few countries) */
  705.  
  706. #define UNZIP_VERSION     20   /* compatible with PKUNZIP 2.0 */
  707. #define VMS_VERSION       42   /* if OS-needed-to-extract is VMS:  can do */
  708.  
  709. /*---------------------------------------------------------------------------
  710.     True sizes of the various headers, as defined by PKWARE--so it is not
  711.     likely that these will ever change.  But if they do, make sure both these
  712.     defines AND the typedefs below get updated accordingly.
  713.   ---------------------------------------------------------------------------*/
  714. #define LREC_SIZE     26    /* lengths of local file headers, central */
  715. #define CREC_SIZE     42    /*  directory headers, and the end-of-    */
  716. #define ECREC_SIZE    18    /*  central-dir record, respectively      */
  717.  
  718. #define MAX_BITS      13                 /* used in unShrink() */
  719. #define HSIZE         (1 << MAX_BITS)    /* size of global work area */
  720.  
  721. #define LF      10    /* '\n' on ASCII machines; must be 10 due to EBCDIC */
  722. #define CR      13    /* '\r' on ASCII machines; must be 13 due to EBCDIC */
  723. #define CTRLZ   26    /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
  724.  
  725. #ifdef EBCDIC
  726. #  define ascii_to_native(c)   ebcdic[(c)]
  727. #  define NATIVE    "EBCDIC"
  728. #endif
  729.  
  730. #ifdef MPW
  731. #  define FFLUSH(f)   putc('\n',f)
  732. #else /* !MPW */
  733. #  define FFLUSH      fflush
  734. #endif /* ?MPW */
  735.  
  736. #ifdef VMS
  737. #  define ENV_UNZIP     "UNZIP_OPTS"      /* name of environment variable */
  738. #  define ENV_ZIPINFO   "ZIPINFO_OPTS"
  739. #else /* !VMS */
  740. #  define ENV_UNZIP     "UNZIP"
  741. #  define ENV_ZIPINFO   "ZIPINFO"
  742. #endif /* ?VMS */
  743.  
  744. #ifdef QQ  /* Newtware version */
  745. #  define QCOND   (!quietflg)   /* for no file comments with -vq or -vqq */
  746. #else      /* (original) Bill Davidsen version  */
  747. #  define QCOND   (which_hdr)   /* no way to kill file comments with -v, -l */
  748. #endif
  749.  
  750. #ifndef TRUE
  751. #  define TRUE      1   /* sort of obvious */
  752. #endif
  753. #ifndef FALSE
  754. #  define FALSE     0
  755. #endif
  756.  
  757. #ifndef SEEK_SET
  758. #  define SEEK_SET  0
  759. #  define SEEK_CUR  1
  760. #  define SEEK_END  2
  761. #endif
  762.  
  763. #ifndef S_IRUSR
  764. #  define S_IRWXU       00700       /* read, write, execute: owner */
  765. #  define S_IRUSR       00400       /* read permission: owner */
  766. #  define S_IWUSR       00200       /* write permission: owner */
  767. #  define S_IXUSR       00100       /* execute permission: owner */
  768. #  define S_IRWXG       00070       /* read, write, execute: group */
  769. #  define S_IRGRP       00040       /* read permission: group */
  770. #  define S_IWGRP       00020       /* write permission: group */
  771. #  define S_IXGRP       00010       /* execute permission: group */
  772. #  define S_IRWXO       00007       /* read, write, execute: other */
  773. #  define S_IROTH       00004       /* read permission: other */
  774. #  define S_IWOTH       00002       /* write permission: other */
  775. #  define S_IXOTH       00001       /* execute permission: other */
  776. #endif /* !S_IRUSR */
  777.  
  778. /* Define OS-specific attributes for use on ALL platforms (the S_xxxx
  779.  * versions of these are defined differently by different compilers and
  780.  * operating systems) */
  781.  
  782. #ifdef ZIPINFO
  783. #  define UNX_IFMT       0170000     /* Unix file type mask */
  784. #  define UNX_IFDIR      0040000     /* Unix directory */
  785. #  define UNX_IFREG      0100000     /* Unix regular file */
  786. #  define UNX_IFSOCK     0140000     /* socket */  /* BSD, not SysV or Amiga */
  787. #  define UNX_IFLNK      0120000     /* symbolic link */  /* not SysV, Amiga */
  788. #  define UNX_IFBLK      0060000     /* block special */        /* not Amiga */
  789. #  define UNX_IFCHR      0020000     /* character special */    /* not Amiga */
  790. #  define UNX_IFIFO      0010000     /* fifo */     /* BCC, not MSC or Amiga */
  791. #  define UNX_ISUID      04000       /* set user id on execution */
  792. #  define UNX_ISGID      02000       /* set group id on execution */
  793. #  define UNX_ISVTX      01000       /* directory permissions control */
  794. #  define UNX_ENFMT      UNX_ISGID   /* record locking enforcement flag */
  795. #  define AMI_IFMT       06000       /* Amiga file type mask */
  796. #  define AMI_IFDIR      04000       /* Amiga directory */
  797. #  define AMI_IFREG      02000       /* Amiga regular file */
  798. #  define AMI_IHIDDEN    00200       /* to be supported in AmigaDOS 3.x */
  799. #  define AMI_ISCRIPT    00100       /* executable script (text command file) */
  800. #  define AMI_IPURE      00040       /* allow loading into resident memory */
  801. #  define AMI_IARCHIVE   00020       /* not modified since bit was last set */
  802. #  define AMI_IREAD      00010       /* can be opened for reading */
  803. #  define AMI_IWRITE     00004       /* can be opened for writing */
  804. #  define AMI_IEXECUTE   00002       /* executable image, a loadable runfile */
  805. #  define AMI_IDELETE    00001       /* can be deleted */
  806. #else /* !ZIPINFO */
  807. #  if (defined(UNIX) && defined(S_IFLNK) && !defined(MTS))
  808. #    define SYMLINKS
  809. #    ifndef S_ISLNK
  810. #      define S_ISLNK(m)   (((m) & S_IFMT) == S_IFLNK)
  811. #    endif
  812. #  endif /* UNIX && S_IFLNK && !MTS */
  813. #endif /* ?ZIPINFO */
  814.  
  815.  
  816.  
  817.  
  818.  
  819. /**************/
  820. /*  Typedefs  */
  821. /**************/
  822.  
  823. typedef char              boolean;
  824. typedef long              longint;
  825. typedef unsigned char     uch;  /* code assumes unsigned bytes; these type-  */
  826. typedef unsigned short    ush;  /*  defs replace byte/UWORD/ULONG (which are */
  827. typedef unsigned long     ulg;  /*  predefined on some systems) & match zip  */
  828.  
  829. typedef struct min_info {
  830.     unsigned file_attr;      /* local flavor, as used by creat(), chmod()... */
  831.     int hostnum;
  832.     longint offset;
  833.     ulg compr_size;          /* compressed size (needed if extended header) */
  834.     ulg crc;                 /* crc (needed if extended header) */
  835.     unsigned encrypted : 1;  /* file encrypted: decrypt before uncompressing */
  836.     unsigned ExtLocHdr : 1;  /* use time instead of CRC for decrypt check */
  837.     unsigned text : 1;       /* file is text or binary */
  838.     unsigned lcflag : 1;     /* convert filename to lowercase */
  839. } min_info;
  840.  
  841. typedef struct VMStimbuf {
  842.     char *revdate;           /* (both correspond to Unix modtime/st_mtime) */
  843.     char *credate;
  844. } VMStimbuf;
  845.  
  846. /*---------------------------------------------------------------------------
  847.     Zipfile work area declarations.
  848.   ---------------------------------------------------------------------------*/
  849.  
  850. #if defined(MACOS) || defined(MALLOC_WORK)
  851.    union work {
  852.      struct {
  853.        short *Prefix_of;            /* (8193 * sizeof(short)) */
  854.        uch *Suffix_of;
  855.        uch *Stack;
  856.      } shrink;                      /* unShrink() */
  857.      uch *Slide;                    /* explode(), inflate(), unReduce() */
  858.    };
  859.  
  860. #else /* !(MACOS || MALLOC_WORK) */
  861.    union work {
  862.      struct {
  863. #ifdef HSIZE2    /* needed to avoid errors on some machines? */
  864.        short Prefix_of[HSIZE + 2];  /* (8194 * sizeof(short)) */
  865.        uch Suffix_of[HSIZE + 2];    /* also s-f length_nodes (smaller) */
  866.        uch Stack[HSIZE + 2];        /* also s-f distance_nodes (smaller) */
  867. #else /* !HSIZE2 */
  868.        short Prefix_of[HSIZE];      /* (8192 * sizeof(short)) */
  869.        uch Suffix_of[HSIZE];        /* also s-f length_nodes (smaller) */
  870.        uch Stack[HSIZE];            /* also s-f distance_nodes (smaller) */
  871. #endif /* ?HSIZE2 */
  872.      } shrink;
  873.      uch Slide[WSIZE];
  874.    };
  875. #endif /* ?(MACOS || MALLOC_WORK) */
  876.  
  877. #define prefix_of   area.shrink.Prefix_of
  878. #define suffix_of   area.shrink.Suffix_of
  879. #define stack       area.shrink.Stack
  880. #define slide       area.Slide
  881.  
  882. /*---------------------------------------------------------------------------
  883.     Zipfile layout declarations.  If these headers ever change, make sure the
  884.     xxREC_SIZE defines (above) change with them!
  885.   ---------------------------------------------------------------------------*/
  886.  
  887.    typedef uch   local_byte_hdr[ LREC_SIZE ];
  888. #      define L_VERSION_NEEDED_TO_EXTRACT_0     0
  889. #      define L_VERSION_NEEDED_TO_EXTRACT_1     1
  890. #      define L_GENERAL_PURPOSE_BIT_FLAG        2
  891. #      define L_COMPRESSION_METHOD              4
  892. #      define L_LAST_MOD_FILE_TIME              6
  893. #      define L_LAST_MOD_FILE_DATE              8
  894. #      define L_CRC32                           10
  895. #      define L_COMPRESSED_SIZE                 14
  896. #      define L_UNCOMPRESSED_SIZE               18
  897. #      define L_FILENAME_LENGTH                 22
  898. #      define L_EXTRA_FIELD_LENGTH              24
  899.  
  900.    typedef uch   cdir_byte_hdr[ CREC_SIZE ];
  901. #      define C_VERSION_MADE_BY_0               0
  902. #      define C_VERSION_MADE_BY_1               1
  903. #      define C_VERSION_NEEDED_TO_EXTRACT_0     2
  904. #      define C_VERSION_NEEDED_TO_EXTRACT_1     3
  905. #      define C_GENERAL_PURPOSE_BIT_FLAG        4
  906. #      define C_COMPRESSION_METHOD              6
  907. #      define C_LAST_MOD_FILE_TIME              8
  908. #      define C_LAST_MOD_FILE_DATE              10
  909. #      define C_CRC32                           12
  910. #      define C_COMPRESSED_SIZE                 16
  911. #      define C_UNCOMPRESSED_SIZE               20
  912. #      define C_FILENAME_LENGTH                 24
  913. #      define C_EXTRA_FIELD_LENGTH              26
  914. #      define C_FILE_COMMENT_LENGTH             28
  915. #      define C_DISK_NUMBER_START               30
  916. #      define C_INTERNAL_FILE_ATTRIBUTES        32
  917. #      define C_EXTERNAL_FILE_ATTRIBUTES        34
  918. #      define C_RELATIVE_OFFSET_LOCAL_HEADER    38
  919.  
  920.    typedef uch   ec_byte_rec[ ECREC_SIZE+4 ];
  921. /*     define SIGNATURE                         0   space-holder only */
  922. #      define NUMBER_THIS_DISK                  4
  923. #      define NUM_DISK_WITH_START_CENTRAL_DIR   6
  924. #      define NUM_ENTRIES_CENTRL_DIR_THS_DISK   8
  925. #      define TOTAL_ENTRIES_CENTRAL_DIR         10
  926. #      define SIZE_CENTRAL_DIRECTORY            12
  927. #      define OFFSET_START_CENTRAL_DIRECTORY    16
  928. #      define ZIPFILE_COMMENT_LENGTH            20
  929.  
  930.  
  931.    typedef struct local_file_header {                 /* LOCAL */
  932.        uch version_needed_to_extract[2];
  933.        ush general_purpose_bit_flag;
  934.        ush compression_method;
  935.        ush last_mod_file_time;
  936.        ush last_mod_file_date;
  937.        ulg crc32;
  938.        ulg csize;
  939.        ulg ucsize;
  940.        ush filename_length;
  941.        ush extra_field_length;
  942.    } local_file_hdr;
  943.  
  944.    typedef struct central_directory_file_header {     /* CENTRAL */
  945.        uch version_made_by[2];
  946.        uch version_needed_to_extract[2];
  947.        ush general_purpose_bit_flag;
  948.        ush compression_method;
  949.        ush last_mod_file_time;
  950.        ush last_mod_file_date;
  951.        ulg crc32;
  952.        ulg csize;
  953.        ulg ucsize;
  954.        ush filename_length;
  955.        ush extra_field_length;
  956.        ush file_comment_length;
  957.        ush disk_number_start;
  958.        ush internal_file_attributes;
  959.        ulg external_file_attributes;
  960.        ulg relative_offset_local_header;
  961.    } cdir_file_hdr;
  962.  
  963.    typedef struct end_central_dir_record {            /* END CENTRAL */
  964.        ush number_this_disk;
  965.        ush num_disk_with_start_central_dir;
  966.        ush num_entries_centrl_dir_ths_disk;
  967.        ush total_entries_central_dir;
  968.        ulg size_central_directory;
  969.        ulg offset_start_central_directory;
  970.        ush zipfile_comment_length;
  971.    } ecdir_rec;
  972.  
  973.  
  974.  
  975.  
  976.  
  977. /*************************/
  978. /*  Function Prototypes  */
  979. /*************************/
  980.  
  981. #ifndef __
  982. #  define __   OF
  983. #endif
  984.  
  985. /*---------------------------------------------------------------------------
  986.     Functions in unzip.c and/or zipinfo.c:
  987.   ---------------------------------------------------------------------------*/
  988.  
  989. int    usage                     __((int error));
  990. int    process_zipfile           __((void));
  991. int    process_end_central_dir   __((void));
  992. int    list_files                __((void));                      /* unzip.c */
  993. int    process_cdir_file_hdr     __((void));                      /* unzip.c */
  994. int    process_local_file_hdr    __((void));                      /* unzip.c */
  995. int    process_central_dir       __((void));                    /* zipinfo.c */
  996. int    long_info                 __((void));                    /* zipinfo.c */
  997. int    short_info                __((void));                    /* zipinfo.c */
  998. char   *zipinfo_time             __((ush *datez, ush *timez));  /* zipinfo.c */
  999.  
  1000. /*---------------------------------------------------------------------------
  1001.     Functions in shared.c:
  1002.   ---------------------------------------------------------------------------*/
  1003.  
  1004. int    open_input_file           __((void));
  1005. int    readbuf                   __((char *buf, register unsigned len));
  1006. int    find_end_central_dir      __((longint searchlen));
  1007. int    get_cdir_file_hdr         __((void));
  1008. int    do_string                 __((unsigned int len, int option));
  1009. ush    makeword                  __((uch *b));
  1010. ulg    makelong                  __((uch *sig));
  1011. #ifdef ZMEM   /* MUST be ifdef'd because of conflicts with the standard def. */
  1012.    char *memset __((register char *, register char, register unsigned int));
  1013.    char *memcpy __((register char *, register char *, register unsigned int));
  1014. #endif /* ZMEM */
  1015.  
  1016. /*---------------------------------------------------------------------------
  1017.     Functions in extract.c:
  1018.   ---------------------------------------------------------------------------*/
  1019.  
  1020. int    extract_or_test_files     __((void));
  1021. /* static int   store_info               __((void)); */
  1022. /* static int   extract_or_test_member   __((void)); */
  1023. int    memextract                __((uch *, ulg, uch *, ulg));
  1024. int    FlushMemory               __((void));
  1025. int    ReadMemoryByte            __((ush *x));
  1026.  
  1027. /*---------------------------------------------------------------------------
  1028.     Decompression functions:
  1029.   ---------------------------------------------------------------------------*/
  1030.  
  1031. int    explode                   __((void));                    /* explode.c */
  1032.  
  1033. int    inflate                   __((void));                    /* inflate.c */
  1034.  
  1035. void   unReduce                  __((void));                   /* unreduce.c */
  1036. /* static void  LoadFollowers    __((void));                    * unreduce.c */
  1037.  
  1038. void   unShrink                  __((void));                   /* unshrink.c */
  1039. /* static void  partial_clear    __((void));                    * unshrink.c */
  1040.  
  1041. /*---------------------------------------------------------------------------
  1042.     Functions in file_io.c:
  1043.   ---------------------------------------------------------------------------*/
  1044.  
  1045. int    create_output_file        __((void));             /* file_io.c, vms.c */
  1046. int    FillBitBuffer             __((void));                    /* file_io.c */
  1047. int    ReadByte                  __((ush *x));                  /* file_io.c */
  1048. int    FlushOutput               __((void));             /* file_io.c, vms.c */
  1049. /* static int   dos2unix         __((unsigned char *, int));     * file_io.c */
  1050. void   handler                   __((int signal));              /* file_io.c */
  1051.  
  1052. /*---------------------------------------------------------------------------
  1053.     Macintosh file_io functions:
  1054.   ---------------------------------------------------------------------------*/
  1055.  
  1056. #ifdef MACOS
  1057. /* static int   IsHFSDisk        __((int)); */
  1058.    void     macfstest            __((int));
  1059.    int      macmkdir             __((char *, short, long));
  1060.    void     ResolveMacVol        __((short, short *, long *, StringPtr));
  1061.    short    macopen              __((char *, short, short, long));
  1062.    short    maccreat             __((char *, short, long, OSType, OSType));
  1063.    short    macread              __((short, char *, unsigned));
  1064.    short    macwrite             __((short, char *, unsigned));
  1065.    short    macclose             __((short));
  1066.    long     maclseek             __((short, long, short));
  1067. #endif
  1068.  
  1069. /*---------------------------------------------------------------------------
  1070.     OS/2 file_io functions:
  1071.   ---------------------------------------------------------------------------*/
  1072.  
  1073. void     ChangeNameForFAT  __((char *name));                   /* os2unzip.c */
  1074. int      IsFileNameValid   __((char *name));                   /* os2unzip.c */
  1075. int      GetCountryInfo    __((void));                         /* os2unzip.c */
  1076. long     GetFileTime       __((char *name));                   /* os2unzip.c */
  1077. void     SetPathInfo      __((char *path, ush moddate, ush modtime, int flags));
  1078. int      SetLongNameEA     __((char *name, char *longname));   /* os2unzip.c */
  1079. int      IsEA              __((void *extra_field));            /* os2unzip.c */
  1080. ulg      SizeOfEAs         __((void *extra_field));            /* os2unzip.c */
  1081. void     SetEAs            __((char *path, void *eablock));    /* os2unzip.c */
  1082. int      IsUpperNLS        __((int nChr));                     /* os2unzip.c */
  1083. int      ToLowerNLS        __((int nChr));                     /* os2unzip.c */
  1084.  
  1085. /*---------------------------------------------------------------------------
  1086.     VMS file_io functions:
  1087.   ---------------------------------------------------------------------------*/
  1088.  
  1089. int      check_format      __((void));                              /* vms.c */
  1090. int      find_vms_attrs    __((void));                              /* vms.c */
  1091. int      CloseOutputFile   __((void));                              /* vms.c */
  1092. /* static uch *extract_block  __((struct extra_block *, int *, uch *, int)); */
  1093. /* static int  _flush_blocks  __((int final_flag));                  * vms.c */
  1094. /* static int  _flush_records __((int final_flag));                  * vms.c */
  1095. /* static int  WriteBuffer    __((unsigned char *buf, int len));     * vms.c */
  1096. /* static int  WriteRecord    __((unsigned char *rec, int len));     * vms.c */
  1097. /* static void message        __((int string, char *status));        * vms.c */
  1098.  
  1099. /*---------------------------------------------------------------------------
  1100.     Functions in match.c, misc.c, etc.:
  1101.   ---------------------------------------------------------------------------*/
  1102.  
  1103. int      match             __((char *string, char *pattern));     /* match.c */
  1104.  
  1105. void     UpdateCRC         __((register unsigned char *s, register int len));
  1106. time_t   dos_to_unix_time  __((unsigned ddate, unsigned dtime));   /* misc.c */
  1107. int      check_for_newer   __((char *filename));                   /* misc.c */
  1108. int      dateformat        __((void));                             /* misc.c */
  1109. void     return_VMS        __((int zip_error));                    /* misc.c */
  1110.  
  1111. void     envargs           __((int *, char ***, char *));       /* envargs.c */
  1112.  
  1113. int      mapname           __((int create_dirs));               /* mapname.c */
  1114. int      mapattr           __((void));                              /* local */
  1115. void     set_file_time_and_close  __((void));                       /* local */
  1116.  
  1117. #ifdef AMIGA
  1118.    LONG  FileDate          __((char *, struct DateStamp *));   /* filedate.c */
  1119. #endif
  1120.  
  1121. #ifdef TOPS20
  1122.    int upper               __((char *s));                        /* tops20.c */
  1123.    int enquote             __((char *s));                        /* tops20.c */
  1124.    int dequote             __((char *s));                        /* tops20.c */
  1125.    int fnlegal             __(());  /* error if prototyped(?) */ /* tops20.c */
  1126. #endif
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132. /************/
  1133. /*  Macros  */
  1134. /************/
  1135.  
  1136. #ifndef MAX
  1137. #  define MAX(a,b)   ((a) > (b) ? (a) : (b))
  1138. #endif
  1139.  
  1140. #ifndef MIN
  1141. #  define MIN(a,b)   ((a) < (b) ? (a) : (b))
  1142. #endif
  1143.  
  1144.  
  1145. #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\
  1146.    inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
  1147.    if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\
  1148.    else if(bufstart!=cur_zipfile_bufstart)\
  1149.    {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
  1150.    if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
  1151.    inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\
  1152.    {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}}
  1153.  
  1154. /*
  1155.  *  Seek to the block boundary of the block which includes abs_offset,
  1156.  *  then read block into input buffer and set pointers appropriately.
  1157.  *  If block is already in the buffer, just set the pointers.  This macro
  1158.  *  is used by process_end_central_dir (unzip.c) and do_string (misc.c).
  1159.  *  A slightly modified version is embedded within extract_or_test_files
  1160.  *  (unzip.c).  ReadByte and readbuf (file_io.c) are compatible.
  1161.  *
  1162.  *  macro LSEEK(abs_offset)
  1163.  *      ulg abs_offset;
  1164.  *  {
  1165.  *      longint   request = abs_offset + extra_bytes;
  1166.  *      longint   inbuf_offset = request % INBUFSIZ;
  1167.  *      longint   bufstart = request - inbuf_offset;
  1168.  *
  1169.  *      if (request < 0) {
  1170.  *          fprintf(stderr, SeekMsg, ReportMsg);
  1171.  *          return(3);             /-* 3:  severe error in zipfile *-/
  1172.  *      } else if (bufstart != cur_zipfile_bufstart) {
  1173.  *          cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
  1174.  *          if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
  1175.  *              return(51);        /-* 51:  unexpected EOF *-/
  1176.  *          inptr = inbuf + (int)inbuf_offset;
  1177.  *          incnt -= (int)inbuf_offset;
  1178.  *      } else {
  1179.  *          incnt += (inptr-inbuf) - (int)inbuf_offset;
  1180.  *          inptr = inbuf + (int)inbuf_offset;
  1181.  *      }
  1182.  *  }
  1183.  *
  1184.  */
  1185.  
  1186.  
  1187. #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
  1188.   {error_in_archive=error; if(error>1) return error;}
  1189.  
  1190. /*
  1191.  *  Skip a variable-length field, and report any errors.  Used in zipinfo.c
  1192.  *  and unzip.c in several functions.
  1193.  *
  1194.  *  macro SKIP_(length)
  1195.  *      ush length;
  1196.  *  {
  1197.  *      if (length && ((error = do_string(length, SKIP)) != 0)) {
  1198.  *          error_in_archive = error;   /-* might be warning *-/
  1199.  *          if (error > 1)              /-* fatal *-/
  1200.  *              return (error);
  1201.  *      }
  1202.  *  }
  1203.  *
  1204.  */
  1205.  
  1206.  
  1207. #define OUTB(intc) {*outptr++=(uch)(intc); if (++outcnt==OUTBUFSIZ)\
  1208.   FlushOutput();}
  1209.  
  1210. /*
  1211.  *  macro OUTB(intc)
  1212.  *  {
  1213.  *      *outptr++ = (uch)(intc);
  1214.  *      if (++outcnt == OUTBUFSIZ)
  1215.  *          FlushOutput();
  1216.  *  }
  1217.  *
  1218.  */
  1219.  
  1220.  
  1221. #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\
  1222.   zdest=(int)((ush)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;}
  1223.  
  1224. /*
  1225.  * macro READBIT(nbits,zdest)
  1226.  *  {
  1227.  *      if (nbits > bits_left)
  1228.  *          FillBitBuffer();
  1229.  *      zdest = (int)((ush)bitbuf & mask_bits[nbits]);
  1230.  *      bitbuf >>= nbits;
  1231.  *      bits_left -= nbits;
  1232.  *  }
  1233.  *
  1234.  */
  1235.  
  1236.  
  1237. #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
  1238.   (ush)bitbuf & mask_bits[nbits]) : (ush)bitbuf & mask_bits[nbits])
  1239.  
  1240.  
  1241. #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j<len;\
  1242.   (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
  1243.  
  1244. /*
  1245.  *  Remove all the ASCII carriage returns from buffer buf (length len),
  1246.  *  shortening as necessary (note that len gets modified in the process,
  1247.  *  so it CANNOT be an expression).  This macro is intended to be used
  1248.  *  BEFORE A_TO_N(); hence the check for CR instead of '\r'.  NOTE:  The
  1249.  *  if-test gets performed one time too many, but it doesn't matter.
  1250.  *
  1251.  *  macro NUKE_CRs(buf,len)
  1252.  *  {
  1253.  *      register int   i, j;
  1254.  *
  1255.  *      for (i = j = 0;  j < len;  (buf)[i++] = (buf)[j++])
  1256.  *          if ((buf)[j] == CR)
  1257.  *              ++j;
  1258.  *      len = i;
  1259.  *  }
  1260.  *
  1261.  */
  1262.  
  1263.  
  1264. #define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
  1265.   while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
  1266.   *ps2='\0';}
  1267.  
  1268. /*
  1269.  *  Copy the zero-terminated string in str1 into str2, converting any
  1270.  *  uppercase letters to lowercase as we go.  str2 gets zero-terminated
  1271.  *  as well, of course.  str1 and str2 may be the same character array.
  1272.  *
  1273.  *  macro TOLOWER( str1, str2 )
  1274.  *  {
  1275.  *      char  *ps1, *ps2;
  1276.  *
  1277.  *      ps1 = (str1) - 1;
  1278.  *      ps2 = (str2);
  1279.  *      while (*++ps1)
  1280.  *          *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
  1281.  *      *ps2='\0';
  1282.  *  }
  1283.  *
  1284.  *  NOTES:  This macro makes no assumptions about the characteristics of
  1285.  *    the tolower() function or macro (beyond its existence), nor does it
  1286.  *    make assumptions about the structure of the character set (i.e., it
  1287.  *    should work on EBCDIC machines, too).  The fact that either or both
  1288.  *    of isupper() and tolower() may be macros has been taken into account;
  1289.  *    watch out for "side effects" (in the C sense) when modifying this
  1290.  *    macro.
  1291.  */
  1292.  
  1293.  
  1294. #ifndef ascii_to_native
  1295. #  define ascii_to_native(c)   (c)
  1296. #  define A_TO_N(str1)
  1297. #else
  1298. #  ifndef NATIVE
  1299. #    define NATIVE     "native chars"
  1300. #  endif
  1301. #  define A_TO_N(str1) {register unsigned char *ps1;\
  1302.      for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
  1303. #endif
  1304.  
  1305. /*
  1306.  *  Translate the zero-terminated string in str1 from ASCII to the native
  1307.  *  character set. The translation is performed in-place and uses the
  1308.  *  ascii_to_native macro to translate each character.
  1309.  *
  1310.  *  macro A_TO_N( str1 )
  1311.  *  {
  1312.  *      register unsigned char *ps1;
  1313.  *
  1314.  *      for (ps1 = str1;  *ps1;  ++ps1)
  1315.  *          *ps1 = ascii_to_native(*ps1);
  1316.  *  }
  1317.  *
  1318.  *  NOTE:  Using the ascii_to_native macro means that is it the only part of
  1319.  *    unzip which knows which translation table (if any) is actually in use
  1320.  *    to produce the native character set.  This makes adding new character
  1321.  *    set translation tables easy, insofar as all that is needed is an
  1322.  *    appropriate ascii_to_native macro definition and the translation
  1323.  *    table itself.  Currently, the only non-ASCII native character set
  1324.  *    implemented is EBCDIC, but this may not always be so.
  1325.  */
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331. /*************/
  1332. /*  Globals  */
  1333. /*************/
  1334.  
  1335.    extern int       aflag;
  1336. /* extern int       bflag;   reserved */
  1337.    extern int       cflag;
  1338.    extern int       fflag;
  1339.    extern int       jflag;
  1340.    extern int       overwrite_none;
  1341.    extern int       overwrite_all;
  1342.    extern int       force_flag;
  1343.    extern int       quietflg;
  1344. #ifdef DOS_OS2
  1345.    extern int       sflag;
  1346. #endif
  1347.    extern int       tflag;
  1348.    extern int       uflag;
  1349.    extern int       V_flag;
  1350. #ifdef VMS
  1351.    extern int       secinf;
  1352. #endif
  1353. #ifdef MACOS
  1354.    extern int       hfsflag;
  1355. #endif
  1356.    extern int       filespecs;
  1357.    extern int       xfilespecs;
  1358.    extern int       process_all_files;
  1359.    extern longint   real_ecrec_offset;
  1360.    extern longint   expect_ecrec_offset;
  1361.    extern longint   csize;
  1362.    extern longint   ucsize;
  1363.    extern char      **pfnames;
  1364.    extern char      **pxnames;
  1365.    extern char      sig[];
  1366.    extern char      answerbuf[];
  1367.    extern min_info  *pInfo;
  1368. #ifdef OS2
  1369.    extern int       longname;
  1370.    extern char      longfilename[];
  1371. #endif
  1372.    extern char      *key;
  1373.  
  1374.    extern union work area;
  1375.  
  1376.    extern ulg       crc32val;
  1377.    extern ush       mask_bits[];
  1378.  
  1379.    extern uch       *inbuf;
  1380.    extern uch       *inptr;
  1381.    extern int       incnt;
  1382.    extern ulg       bitbuf;
  1383.    extern int       bits_left;
  1384.    extern boolean   zipeof;
  1385. #ifdef MSWIN
  1386.    extern char      *zipfn;
  1387. #else
  1388.    extern char      zipfn[];
  1389. #endif
  1390.    extern int       zipfd;
  1391.    extern longint   ziplen;
  1392.    extern longint   extra_bytes;
  1393.    extern longint   cur_zipfile_bufstart;
  1394.    extern uch       *extra_field;
  1395.    extern uch       *hold;
  1396.    extern char      local_hdr_sig[];
  1397.    extern char      central_hdr_sig[];
  1398.    extern char      end_central_sig[];
  1399.    extern local_file_hdr  lrec;
  1400.    extern cdir_file_hdr   crec;
  1401.    extern ecdir_rec       ecrec;
  1402.    extern struct stat     statbuf;
  1403.  
  1404.    extern uch       *outbuf;
  1405.    extern uch       *outptr;
  1406. #ifdef MSWIN
  1407.    extern uch __far *outout;
  1408.    extern char      *filename;
  1409. #else
  1410.    extern uch       *outout;
  1411.    extern char      filename[];
  1412. #endif
  1413.    extern longint   outpos;
  1414.    extern int       outcnt;
  1415.    extern int       outfd;
  1416.    extern int       mem_mode;
  1417.    extern int       disk_full;
  1418.    extern int       newfile;
  1419. #ifdef SYMLINKS
  1420.    extern int       symlnk;
  1421. #endif
  1422.  
  1423.    extern char      *EndSigMsg;
  1424.    extern char      *CentSigMsg;
  1425.    extern char      *SeekMsg;
  1426.    extern char      *ReportMsg;
  1427.  
  1428. #ifdef DECLARE_ERRNO
  1429.    extern int       errno;
  1430. #endif
  1431.  
  1432. #ifdef EBCDIC
  1433.    extern uch       ebcdic[];
  1434. #endif
  1435.  
  1436. #ifdef MACOS
  1437.    extern short     gnVRefNum;
  1438.    extern long      glDirID;
  1439.    extern OSType    gostCreator;
  1440.    extern OSType    gostType;
  1441.    extern boolean   fMacZipped;
  1442.    extern boolean   macflag;
  1443.    extern short     giCursor;
  1444.    extern CursHandle rghCursor[];
  1445. #endif
  1446.  
  1447. #endif /* !__unzip_h */
  1448.